package com.cskaoyan.javase.oop3._2inner._5anonymous._1basic;

/**
 * 匿名内部类是特殊的局部内部类
 * 它仍然定义局部位置
 * 它的一些特点和局部内部类相似,但也有很多不同
 * 语法:
 * new 类名或者接口名(){
 *   // 某类名或接口名的子类的类体
 * };
 * 语法中的"()"有什么用途呢?是好看的?还是固定语法形式?还是说有用?
 * "()"是有用途的,是给匿名子类的父类构造器传参的
 * 当然普通类以及抽象类是存在构造器,接口没有构造器,所以接口的匿名内部类语法中的"()"就是纯粹语法格式了
 *
 * 匿名内部类是特殊的局部内部类,那么匿名内部类有构造器吗?
 * 局部内部类的成员特点和成员内部类一样,没有static声明,其他的和正常类一样.
 * 匿名内部类的语法中,没有位置给匿名子类构造器传参,所以匿名子类的构造器是没有意义的
 * 实际上匿名内部类的子类类体中也是不可以定义构造器的
 *
 * 补充:
 *      虽然匿名内部类当中没有办法定义构造器
 *      但是匿名内部类当中实际上是有构造器的(默认提供的无参构造器)
 *      因为在匿名内部类当中可以使用构造代码块
 *
 *
 * @since 11:32
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 直接在main方法当中定义匿名内部类
        // 创建接口IA的子类对象
        new IA() {
            @Override
            public void test() {
                System.out.println("匿名内部类创建接口子类对象!");
            }
            // 构造代码块
            {
                System.out.println("匿名内部类的构造代码块");
            }
        }.test();

        // 直接匿名内部类创建A的子类对象
        System.out.println(new A(300) {
        }.num);
    }
}

class A {
    int num;

    public A(int num) {
        this.num = num;
    }
}

interface IA {
    void test();
}
